{
 "cells": [
  {
   "cell_type": "code",
   "execution_count": 1,
   "metadata": {},
   "outputs": [],
   "source": [
    "import pandas as pd\n",
    "import numpy as np\n",
    "import matplotlib.pyplot as plt\n",
    "import seaborn as sns\n",
    "from xgboost import XGBClassifier\n",
    "import xgboost as xgb\n",
    "from sklearn.metrics import log_loss\n",
    "\n",
    "\n",
    "from sklearn.model_selection import GridSearchCV\n",
    "from sklearn.model_selection import StratifiedKFold"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 2,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "train data is as follows ******************:\n",
      "    bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
      "0        1.5         3   3000           1200.0      750.000000       -1.5   \n",
      "1        1.0         2   5465           2732.5     1821.666667       -1.0   \n",
      "2        1.0         1   2850           1425.0     1425.000000        0.0   \n",
      "3        1.0         1   3275           1637.5     1637.500000        0.0   \n",
      "4        1.0         4   3350           1675.0      670.000000       -3.0   \n",
      "\n",
      "   room_num  Year  Month  Day       ...        walk  walls  war  washer  \\\n",
      "0       4.5  2016      6   24       ...           0      0    0       0   \n",
      "1       3.0  2016      6   12       ...           0      0    0       0   \n",
      "2       2.0  2016      4   17       ...           0      0    0       0   \n",
      "3       2.0  2016      4   18       ...           0      0    0       0   \n",
      "4       5.0  2016      4   28       ...           0      0    1       0   \n",
      "\n",
      "   water  wheelchair  wifi  windows  work  interest_level  \n",
      "0      0           0     0        0     0               1  \n",
      "1      0           0     0        0     0               2  \n",
      "2      0           0     0        0     0               0  \n",
      "3      0           0     0        0     0               2  \n",
      "4      0           0     0        0     0               2  \n",
      "\n",
      "[5 rows x 228 columns]\n",
      "test data is as follows ******************:\n",
      "    bathrooms  bedrooms  price  price_bathrooms  price_bedrooms  room_diff  \\\n",
      "0        1.0         1   2950      1475.000000     1475.000000        0.0   \n",
      "1        1.0         2   2850      1425.000000      950.000000       -1.0   \n",
      "2        1.0         1   3758      1879.000000     1879.000000        0.0   \n",
      "3        1.0         2   3300      1650.000000     1100.000000       -1.0   \n",
      "4        2.0         2   4900      1633.333333     1633.333333        0.0   \n",
      "\n",
      "   room_num  Year  Month  Day  ...   virtual  walk  walls  war  washer  water  \\\n",
      "0       2.0  2016      6   11  ...         0     0      0    0       0      0   \n",
      "1       3.0  2016      6   24  ...         0     0      0    1       0      0   \n",
      "2       2.0  2016      6    3  ...         0     0      0    0       0      0   \n",
      "3       3.0  2016      6   11  ...         0     0      0    0       0      0   \n",
      "4       4.0  2016      4   12  ...         0     0      0    1       0      0   \n",
      "\n",
      "   wheelchair  wifi  windows  work  \n",
      "0           0     0        0     0  \n",
      "1           0     0        0     0  \n",
      "2           0     0        0     0  \n",
      "3           1     0        0     0  \n",
      "4           0     0        0     0  \n",
      "\n",
      "[5 rows x 227 columns]\n"
     ]
    }
   ],
   "source": [
    "train=pd.read_csv('RentListingInquries_FE_train.csv')\n",
    "test=pd.read_csv('RentListingInquries_FE_test.csv')\n",
    "\n",
    "print('train data is as follows ******************:\\n',train.head())\n",
    "print('test data is as follows ******************:\\n',test.head())"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 3,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "bathrooms                 0\n",
       "bedrooms                  0\n",
       "price                     0\n",
       "price_bathrooms           0\n",
       "price_bedrooms            0\n",
       "room_diff                 0\n",
       "room_num                  0\n",
       "Year                      0\n",
       "Month                     0\n",
       "Day                       0\n",
       "Wday                      0\n",
       "Yday                      0\n",
       "hour                      0\n",
       "top_10_manager            0\n",
       "top_25_manager            0\n",
       "top_5_manager             0\n",
       "top_50_manager            0\n",
       "top_1_manager             0\n",
       "top_2_manager             0\n",
       "top_15_manager            0\n",
       "top_20_manager            0\n",
       "top_30_manager            0\n",
       "cenroid                   0\n",
       "distance                  0\n",
       "display_address_pred_0    0\n",
       "display_address_pred_1    0\n",
       "display_address_pred_2    0\n",
       "1br                       0\n",
       "24                        0\n",
       "2br                       0\n",
       "                         ..\n",
       "sublet                    0\n",
       "subway                    0\n",
       "super                     0\n",
       "superintendent            0\n",
       "swimming                  0\n",
       "tenant                    0\n",
       "term                      0\n",
       "terrace                   0\n",
       "time                      0\n",
       "tons                      0\n",
       "train                     0\n",
       "true                      0\n",
       "tv                        0\n",
       "unit                      0\n",
       "utilities                 0\n",
       "valet                     0\n",
       "video                     0\n",
       "view                      0\n",
       "views                     0\n",
       "virtual                   0\n",
       "walk                      0\n",
       "walls                     0\n",
       "war                       0\n",
       "washer                    0\n",
       "water                     0\n",
       "wheelchair                0\n",
       "wifi                      0\n",
       "windows                   0\n",
       "work                      0\n",
       "interest_level            0\n",
       "Length: 228, dtype: int64"
      ]
     },
     "execution_count": 3,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.isnull().sum() "
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 4,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "<class 'pandas.core.frame.DataFrame'>\n",
      "RangeIndex: 49352 entries, 0 to 49351\n",
      "Columns: 228 entries, bathrooms to interest_level\n",
      "dtypes: float64(9), int64(219)\n",
      "memory usage: 85.8 MB\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "Index(['bathrooms', 'bedrooms', 'price', 'price_bathrooms', 'price_bedrooms',\n",
       "       'room_diff', 'room_num', 'Year', 'Month', 'Day',\n",
       "       ...\n",
       "       'walk', 'walls', 'war', 'washer', 'water', 'wheelchair', 'wifi',\n",
       "       'windows', 'work', 'interest_level'],\n",
       "      dtype='object', length=228)"
      ]
     },
     "execution_count": 4,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train.info()\n",
    "train.describe()\n",
    "train.columns"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 5,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "array([1, 2, 0], dtype=int64)"
      ]
     },
     "execution_count": 5,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "train['interest_level'].unique()#查看分类可取值"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 6,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "<matplotlib.axes._subplots.AxesSubplot at 0x2aae2edff98>"
      ]
     },
     "execution_count": 6,
     "metadata": {},
     "output_type": "execute_result"
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "fig=plt.figure()\n",
    "sns.countplot(train['interest_level'])"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 可以看出样本不均衡分布"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 7,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\ipykernel_launcher.py:2: FutureWarning: reshape is deprecated and will raise in a subsequent release. Please use .values.reshape(...) instead\n",
      "  \n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:95: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:128: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    }
   ],
   "source": [
    "x_train=train.drop('interest_level',axis=1)\n",
    "y_train=train['interest_level'].reshape(-1,1)\n",
    "# print(x_train.shape,y_train.shape)\n",
    "\n",
    "#准备交叉验证\n",
    "kfold=StratifiedKFold(n_splits=5,shuffle=True,random_state=3)\n",
    "\n",
    "#直接调用xgboost内嵌的cv，对树目快速预测\n",
    "def modelfit(alg,x_train,y_train,cv_folds=None,early_stopping_rounds=10):\n",
    "    xgb_param=alg.get_xgb_params()\n",
    "    xgb_param['num_class']=9\n",
    "    \n",
    "    #直接调用xgboost\n",
    "    xgtrain=xgb.DMatrix(x_train,label=y_train)\n",
    "    \n",
    "    cvresult=xgb.cv(xgb_param,xgtrain,num_boost_round=alg.get_xgb_params()['n_estimators'],folds=cv_folds,\n",
    "              metrics='mlogloss', early_stopping_rounds=early_stopping_rounds     \n",
    "                   )\n",
    "    cvresult.to_csv('1_nestimators.csv',index_label='n_estimators')\n",
    "    \n",
    "    #最佳参数n_estimators\n",
    "    n_estimators=cvresult.shape[0]\n",
    "    \n",
    "    #采用交叉验证得到的最佳参数来训练模型\n",
    "    alg.set_params(n_estimators=n_estimators)\n",
    "    alg.fit(x_train,y_train,eval_metric='mlogloss')\n",
    "\n",
    "\n",
    "    \n",
    "    \n",
    "    \n",
    "xgb1=XGBClassifier(\n",
    "    learning_rate =0.1,\n",
    "        n_estimators=1000,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=5,\n",
    "        min_child_weight=1,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3\n",
    ")\n",
    "modelfit(xgb1, x_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 8,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\ipykernel_launcher.py:2: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  \n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "from matplotlib import pyplot\n",
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "        \n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(0, cvresult.shape[0])\n",
    "       \n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators4_1.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 9,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\ipykernel_launcher.py:1: FutureWarning: from_csv is deprecated. Please use read_csv(...) instead. Note that some of the default arguments are different, so please refer to the documentation for from_csv when changing your function calls\n",
      "  \"\"\"Entry point for launching an IPython kernel.\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 1000x1000 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "cvresult = pd.DataFrame.from_csv('1_nestimators.csv')\n",
    "\n",
    "cvresult = cvresult.iloc[100:]\n",
    "# plot\n",
    "test_means = cvresult['test-mlogloss-mean']\n",
    "test_stds = cvresult['test-mlogloss-std'] \n",
    "        \n",
    "train_means = cvresult['train-mlogloss-mean']\n",
    "train_stds = cvresult['train-mlogloss-std'] \n",
    "\n",
    "x_axis = range(100,cvresult.shape[0]+100)\n",
    "        \n",
    "fig = pyplot.figure(figsize=(10, 10), dpi=100)\n",
    "pyplot.errorbar(x_axis, test_means, yerr=test_stds ,label='Test')\n",
    "pyplot.errorbar(x_axis, train_means, yerr=train_stds ,label='Train')\n",
    "pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "pyplot.xlabel( 'n_estimators' )\n",
    "pyplot.ylabel( 'Log Loss' )\n",
    "pyplot.savefig( 'n_estimators_detail.png' )\n",
    "\n",
    "pyplot.show()"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 11,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(162, 4)"
      ]
     },
     "execution_count": 11,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cvresult.shape"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "即n_estimators数目为162"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 12,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "{'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)}"
      ]
     },
     "execution_count": 12,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "#2.调整参数max_depth和min_child_weight\n",
    "# 准备交叉验证\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    "\n",
    "max_depth=range(3,10,2)\n",
    "min_child_weight = range(1,6,2)\n",
    "param_test2_1 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_1"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 14,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:95: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:128: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "data": {
      "text/plain": [
       "GridSearchCV(cv=StratifiedKFold(n_splits=5, random_state=3, shuffle=True),\n",
       "       error_score='raise',\n",
       "       estimator=XGBClassifier(base_score=0.5, booster='gbtree', colsample_bylevel=0.7,\n",
       "       colsample_bytree=0.8, gamma=0, learning_rate=0.1, max_delta_step=0,\n",
       "       max_depth=5, min_child_weight=1, missing=None, n_estimators=162,\n",
       "       n_jobs=1, nthread=None, objective='multi:softprob', random_state=0,\n",
       "       reg_alpha=0, reg_lambda=1, scale_pos_weight=1, seed=3, silent=True,\n",
       "       subsample=0.3),\n",
       "       fit_params=None, iid=True, n_jobs=-1,\n",
       "       param_grid={'max_depth': range(3, 10, 2), 'min_child_weight': range(1, 6, 2)},\n",
       "       pre_dispatch='2*n_jobs', refit=True, return_train_score='warn',\n",
       "       scoring='neg_log_loss', verbose=0)"
      ]
     },
     "execution_count": 14,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "xgb2_1 = XGBClassifier(\n",
    "    learning_rate=0.1,\n",
    "    n_estimators=162,  # 第一轮参数调整得到的n_estimators最优值\n",
    "    max_depth=5,\n",
    "    min_child_weight=1,\n",
    "    gamma=0,\n",
    "    subsample=0.3,\n",
    "    colsample_bytree=0.8,\n",
    "    colsample_bylevel=0.7,\n",
    "    objective='multi:softprob',\n",
    "    seed=3)\n",
    "\n",
    "gsearch2_1 = GridSearchCV(xgb2_1, param_grid=param_test2_1, scoring='neg_log_loss', n_jobs=-1, cv=kfold)\n",
    "gsearch2_1.fit(x_train, y_train)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 15,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Best: -0.588099 using {'max_depth': 7, 'min_child_weight': 5}\n"
     ]
    },
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('mean_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('std_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split0_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split1_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split2_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split3_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\utils\\deprecation.py:122: FutureWarning: You are accessing a training score ('split4_train_score'), which will not be available by default any more in 0.21. If you need training scores, please set return_train_score=True\n",
      "  warnings.warn(*warn_args, **warn_kwargs)\n"
     ]
    }
   ],
   "source": [
    "#可视化\n",
    "# summarize results\n",
    "print(\"Best: %f using %s\" % (gsearch2_1.best_score_, gsearch2_1.best_params_))\n",
    "test_means = gsearch2_1.cv_results_['mean_test_score']\n",
    "test_stds = gsearch2_1.cv_results_['std_test_score']\n",
    "train_means = gsearch2_1.cv_results_['mean_train_score']\n",
    "train_stds = gsearch2_1.cv_results_['std_train_score']\n",
    "\n",
    "pd.DataFrame(gsearch2_1.cv_results_).to_csv('my_preds_maxdepth_min_child_weights_1.csv')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 16,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAAZIAAAELCAYAAADz6wBxAAAABHNCSVQICAgIfAhkiAAAAAlwSFlzAAALEgAACxIB0t1+/AAAADl0RVh0U29mdHdhcmUAbWF0cGxvdGxpYiB2ZXJzaW9uIDIuMi4yLCBodHRwOi8vbWF0cGxvdGxpYi5vcmcvhp/UCwAAIABJREFUeJzt3XucHGWd7/HPry/Tk8kkIeYCuUFiSLglIUA2RDnc3A0EL2jERUBc4KjsqhzW9aCI7sqBRdSzr6N4YV1BQVflIjeNboAEROKCGBKcQAiShKtDkIRA7kzPdPfv/NHVPd093TM9U9Pdk+T7fr361d1VT1U9Xck8366nuuoxd0dERGSgIo2ugIiI7N0UJCIiEoqCREREQlGQiIhIKAoSEREJRUEiIiKhKEhERCQUBYmIiISiIBERkVBija5APYwdO9anTp3a6GqIiOxVVq9e/bq7j+ur3H4RJFOnTmXVqlWNroaIyF7FzF6qppy6tkREJBQFiYiIhKIgERGRUBQkIiISioJERERCUZCIiEgoChIREQllv7iORCQMdyeVcVJppyuTIR08p9JOOuN0pTP5+alMhq5geiqdoSvjpINpufn554yTcYhFjKgZ0YgRiwbPESMaiQTP1v0crTA9EiESgVgk0j09WjLfwMwavTtlH6QgkUHhHjSeuUdB49qVzgTzuhvZXOObn1dQrqtk+cLGt2cjHawrXbzd/LqC5XqUyxQvk19vmTqmM97o3TtoegZTpCSQjMiAgqxgerQgGIsCrcJy0fLBGI3Q7zAtDs/sczSiMK01BUmdZTLd32aLGtySBq27Eav8bTbX+BY13oWNY7B8tlywroqNdEmjniloiPPbKF5Xabl6i0ezjUMsaFxi0e7X8dw382gkKJct2xSL0JIrFzHiuYY0t0zUiEeK19W9jey68uutWK57vbk6RoNtxXJ1CZbHIJOBtDvpgtDLBViq4N+w7PTc+2B+Ojh6SheEYNll0r2sK+NkKtQh2ZUhlUn3Wofc9HSZ7Q8F1YRpd5hl/z0j1v8wLTc9UnY7vYVpz6PLqPUvTEc0x4lGahueCpJe3LjiedZu2t6zkS79Zpxr/Mt2dxQ0+pkMXue/pdx/pqJGLFLcoBU2hLmGsjUey/8BxAsb6ZIGNV4yvXAb8dx/9qjlX5dtfKO91TFS1Mjnyumb5d7HPduVVxSWRYFWEqIF4difMC0XjOlyy/QRpt3zM0Xr6E+YlqtDvT3w2ZM5dHxrTbehIOnF+td20vbnbdkGs0zjOyweJZqIdX/rrPLbbLzg20e5xrP022zlRrp7+eI6dpdVYytDhZkRNYhGoo2uSsPkuoDTXi6wKodppSPVdIY+g2xca6Lmn0tB0ot/+9ujG10FEdmHWNAtta81vPr5r4iIhKIgERGRUBQkIiISioJERERCUZCIiEgoChIREQlFQSIiIqEoSEREJBQFiYiIhKIgERGRUBQkIiISioJERERCUZCIiEgoChIREQlFQSIiIqEoSEREJBQFiYiIhKIgERGRUBQkIiISioJERERCUZCIiEgoChIREQlFQSIiIqEoSEREJBQFiYiIhKIgERGRUBQkIiISioJERERCqWmQmNkiM3vWzDaa2RcqlDnbzNaZ2dNmdkvB9AvMbEPwuKBg+m+DdbYFj/G1/AwiItK7WK1WbGZR4HpgIdAOPG5mS9x9XUGZGcAVwAnu/mYuFMzsbcCVwDzAgdXBsm8Gi37E3VfVqu4iIlK9Wh6RzAc2uvvz7t4J3Aa8v6TMJ4DrcwHh7puD6acDy939jWDecmBRDesqIiIDVMsgmQT8ueB9ezCt0Exgppk9YmaPmdmiKpe9OejW+hczs3IbN7OLzWyVma3asmVLuE8iIiIV1TJIyjXwXvI+BswATgHOBX5gZgf0sexH3H02cGLw+Gi5jbv7De4+z93njRs3bgDVFxGRatQySNqBKQXvJwObypT5pbt3ufsLwLNkg6Xisu7+SvC8E7iFbBeaiIg0SC2D5HFghplNM7Mm4BxgSUmZXwCnApjZWLJdXc8D9wOnmdloMxsNnAbcb2axoBxmFgfeC6yt4WcQEZE+1OxXW+6eMrNLyIZCFLjJ3Z82s6uBVe6+hO7AWAekgc+5+1YAM/tXsmEEcLW7v2Fmw8kGSjxY5wPAjbX6DCIi0jdzLz1tse+ZN2+er1qlXwuLiPSHma1293l9ldOV7SIiEoqCREREQlGQiIhIKAoSEREJRUEiIiKhKEhERCQUBYmIiISiIBERkVAUJCIiEoqCREREQlGQiIhIKAoSEREJRUEiIiKhKEhERCQUBYmIiISiIBERkVAUJCIiEoqCREREQlGQiIhIKAoSEREJRUEiIiKhKEhERCQUBYmIiISiIBERkVBija6AiAwtXV1dtLe309HR0eiqSJ00NzczefJk4vH4gJZXkIhIkfb2dkaMGMHUqVMxs0ZXR2rM3dm6dSvt7e1MmzZtQOtQ15aIFOno6GDMmDEKkf2EmTFmzJhQR6AKEhHpQSGyfwn7760gERGRUBQkIjKkbNu2jX//938f0LLXXXcde/bsGeQaDY5TTjmFVatWDWjZX/ziF6xbt65f6+ro6GD+/PkcffTRHHXUUVx55ZUD2nY1FCQiMqTsq0ESRmmQVCORSPCb3/yGNWvW0NbWxn333cdjjz1Wk/rpV1siUtFVv3qadZt2DOo6j5w4kivfd1TF+V/4whd47rnnmDt3LgsXLmT8+PH8/Oc/J5lMsnjxYq666ip2797N2WefTXt7O+l0mn/5l3/htddeY9OmTZx66qmMHTuWhx56qOz6W1tb+fSnP80DDzzA6NGjufbaa/n85z/Pyy+/zHXXXceZZ57Jiy++yEc/+lF2794NwHe/+13e+c53cs8993D99dezfPly/vKXv3DyySezYsUKDjrooB7beeutt7joootYt24dRxxxBG+99VZ+3rJly7jyyitJJpNMnz6dm2++mdbWVqZOncqHP/zhfN1vueUWNm/ezJIlS3j44Ye55ppruOuuuwC44447+NSnPsW2bdv44Q9/yIknnli0fTOjtbUVyP6ku6urq2bnvnREIiJDyte+9jWmT59OW1sbCxcuZMOGDaxcuZK2tjZWr17NihUruO+++5g4cSJr1qxh7dq1LFq0iEsvvZSJEyfy0EMPVQwRgN27d3PKKaewevVqRowYwT//8z+zfPly7rnnHr785S8DMH78eJYvX84TTzzB7bffzqWXXgrA4sWLOeigg7j++uv5xCc+wVVXXVU2RAC+973v0dLSwpNPPsmXvvQlVq9eDcDrr7/ONddcwwMPPMATTzzBvHnz+MY3vpFfbuTIkaxcuZJLLrmEz3zmM7zzne/kzDPP5N/+7d9oa2tj+vTpAKRSKVauXMl1113HVVddBcCmTZt497vfnV9XOp1m7ty5jB8/noULF3L88ceH+JepTEckIlJRb0cO9bBs2TKWLVvGMcccA8CuXbvYsGEDJ554IpdddhmXX345733ve3t8G+9NU1MTixYtAmD27NkkEgni8TizZ8/mxRdfBLLf4C+55BLa2tqIRqOsX78+v/x3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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "\n",
    "# plot results\n",
    "test_scores = np.array(test_means).reshape(len(max_depth), len(min_child_weight))\n",
    "train_scores = np.array(train_means).reshape(len(max_depth), len(min_child_weight))\n",
    "\n",
    "for i, value in enumerate(max_depth):\n",
    "    pyplot.plot(min_child_weight, -test_scores[i], label='test_max_depth:' + str(value))\n",
    "# for i, value in enumerate(min_child_weight):\n",
    "#    pyplot.plot(max_depth, train_scores[i], label= 'train_min_child_weight:'   + str(value))\n",
    "\n",
    "pyplot.legend()\n",
    "pyplot.xlabel('max_depth')\n",
    "pyplot.ylabel('Log Loss')\n",
    "pyplot.savefig('max_depth_vs_min_child_weght_1.png')\n"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#2.2 进行max_depth和min_child_weight微调\n",
    "# 每类样本分布不是很均匀，所以交叉验证时也考虑各类样本按比例抽取\n",
    "# 各类样本不均衡，交叉验证是采用StratifiedKFold，在每折采样时各类样本按比例采样\n",
    "# prepare cross validation\n",
    "kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=3)\n",
    "#max_depth 建议3-10， min_child_weight=1／sqrt(ratio_rare_event) =5.5\n",
    "max_depth = [6,7,8]\n",
    "min_child_weight = [4,5,6]\n",
    "param_test2_2 = dict(max_depth=max_depth, min_child_weight=min_child_weight)\n",
    "param_test2_2"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:95: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n",
      "g:\\software\\python3.6\\lib\\site-packages\\sklearn\\preprocessing\\label.py:128: DataConversionWarning: A column-vector y was passed when a 1d array was expected. Please change the shape of y to (n_samples, ), for example using ravel().\n",
      "  y = column_or_1d(y, warn=True)\n"
     ]
    },
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "logloss of train :\n",
      "0.4862263639494053\n"
     ]
    },
    {
     "data": {
      "image/png": "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\n",
      "text/plain": [
       "<Figure size 432x288 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "#2.3再次确定弱分类器的数目\n",
    "def modelfit(alg, x_train, y_train, useTrainCV=True, cv_folds=None, early_stopping_rounds=100):\n",
    "    if useTrainCV:\n",
    "        xgb_param = alg.get_xgb_params()\n",
    "        xgb_param['num_class'] = 9\n",
    "\n",
    "        xgtrain = xgb.DMatrix(x_train, label=y_train)\n",
    "\n",
    "        cvresult = xgb.cv(xgb_param, xgtrain, num_boost_round=alg.get_params()['n_estimators'], folds=cv_folds,\n",
    "                          metrics='mlogloss', early_stopping_rounds=early_stopping_rounds)\n",
    "\n",
    "        n_estimators = cvresult.shape[0]\n",
    "        alg.set_params(n_estimators=n_estimators)\n",
    "\n",
    "        print\n",
    "        cvresult\n",
    "        # result = pd.DataFrame(cvresult)   #cv缺省返回结果为DataFrame\n",
    "        # result.to_csv('my_preds.csv', index_label = 'n_estimators')\n",
    "        cvresult.to_csv('my_preds4_2_3_699.csv', index_label='n_estimators')\n",
    "\n",
    "        # plot\n",
    "        test_means = cvresult['test-mlogloss-mean']\n",
    "        test_stds = cvresult['test-mlogloss-std']\n",
    "\n",
    "        train_means = cvresult['train-mlogloss-mean']\n",
    "        train_stds = cvresult['train-mlogloss-std']\n",
    "\n",
    "        x_axis = range(0, n_estimators)\n",
    "        pyplot.errorbar(x_axis, test_means, yerr=test_stds, label='Test')\n",
    "        pyplot.errorbar(x_axis, train_means, yerr=train_stds, label='Train')\n",
    "        pyplot.title(\"XGBoost n_estimators vs Log Loss\")\n",
    "        pyplot.xlabel('n_estimators')\n",
    "        pyplot.ylabel('Log Loss')\n",
    "        pyplot.savefig('n_estimators4_2_3_699.png')\n",
    "\n",
    "    # Fit the algorithm on the data\n",
    "    alg.fit(x_train, y_train, eval_metric='mlogloss')\n",
    "\n",
    "    # Predict training set:\n",
    "    train_predprob = alg.predict_proba(x_train)\n",
    "    logloss = log_loss(y_train, train_predprob)\n",
    "\n",
    "    # Print model report:\n",
    "    print(\"logloss of train :\")\n",
    "    print (logloss)\n",
    "#调整max_depth和min_child_weight之后再次调整n_estimators(7,5)\n",
    "xgb2_3 = XGBClassifier(\n",
    "        learning_rate =0.1,\n",
    "        n_estimators=500,  #数值大没关系，cv会自动返回合适的n_estimators\n",
    "        max_depth=7,\n",
    "        min_child_weight=5,\n",
    "        gamma=0,\n",
    "        subsample=0.3,\n",
    "        colsample_bytree=0.8,\n",
    "        colsample_bylevel=0.7,\n",
    "        objective= 'multi:softprob',\n",
    "        seed=3)\n",
    "\n",
    "modelfit(xgb2_3, x_train, y_train, cv_folds = kfold)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "text/plain": [
       "(162, 4)"
      ]
     },
     "execution_count": 27,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "source": [
    "cvresult.shape#确定微调后的最佳n_estimators的数目仍然是162"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "#2C：预测结果：\n",
    "\n",
    "xgb3_1 = XGBClassifier(\n",
    "    learning_rate=0.1,\n",
    "    n_estimators=162,  # 第二轮参数调整得到的n_estimators最优值\n",
    "    max_depth=7,\n",
    "    min_child_weight=5,\n",
    "    gamma=0,\n",
    "    subsample=0.3,\n",
    "    colsample_bytree=0.8,\n",
    "    colsample_bylevel=0.7,\n",
    "    objective='multi:softprob',\n",
    "    seed=3)\n",
    "\n",
    "xgb3_1.fit(x_train, y_train,eval_metric='mlogloss')\n",
    "test_preprob=xgb3_1.predict(x_test)\n",
    "logloss = log_loss(y_test, test_predprob)\n",
    "\n",
    "# Print model report:\n",
    "print(\"logloss of train :\")\n",
    "print (logloss)"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": [
    "print('fa')"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": null,
   "metadata": {},
   "outputs": [],
   "source": []
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.6.5"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 2
}
